package ModelLayer;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;

public class LeaseItemRecords {

	private ArrayList<LeaseItem> leaseItems;
	// singleton stuff
	private static LeaseItemRecords instance;

	private LeaseItemRecords() {
		leaseItems = new ArrayList<LeaseItem>();
	}

	public static LeaseItemRecords getInstance() {
		if (instance == null) {
			instance = new LeaseItemRecords();
		}
		return instance;
	}

	public void createLeaseItem(String name, int location, double price)
			throws RealException {
		LeaseItem leaseItem = new LeaseItem(name, location, price);
		leaseItems.add(leaseItem);
		if (!leaseItems.contains(leaseItem)) {
			throw new RealException(
					"Something went wrong during creating of lease Item!");
		}
	}

	public LeaseItem getLeaseItem(int id) throws RealException {
		LeaseItem theLeaseItem = null;
		Iterator<LeaseItem> it = leaseItems.iterator();
		boolean found = false;

		while (it.hasNext() && !found) {
			LeaseItem leaseItem = it.next();
			if (leaseItem.getId() == id) {
				theLeaseItem = leaseItem;
				found = true;
			}
		}
		if (!found)
			throw new RealException("Lease item not found!");
		return theLeaseItem;
	}

	public void checkLeaseItem(int id) throws RealException {
		Iterator<LeaseItem> it = leaseItems.iterator();
		boolean found = false;
		while (it.hasNext() && !found) {
			LeaseItem leaseItem = it.next();
			if (leaseItem.getId() == id) {
				found = true;
			}
		}
		if (!found)
			throw new RealException("Lease item not found!");
	}

	public void updateLeaseItem(int id, int fieldID, String value)
			throws RealException {
		if (!value.equals(null)) {
			if (fieldID >= 1 && fieldID <= 3) {
				LeaseItem leaseItem = getLeaseItem(id);
				switch (fieldID) {
				case 1:
					leaseItem.setName(value);
					break;
				case 2:
					leaseItem.setLocation(Integer.parseInt(value));
					break;
				case 3:
					leaseItem.setPrice(Double.parseDouble(value));
					break;
				}
			} else {
				throw new RealException(
						"Passed fieldID was lesser than 1, or more then 3");
			}
		} else {
			throw new RealException("Passed value is \"null\"!");
		}
	}

	public void deleteLeaseItem(int id) throws RealException {
		LeaseItem leaseItem = getLeaseItem(id);
		if (leaseItem != null) {
			leaseItems.remove(leaseItem);
		}
	}

	public ArrayList<String> getLeaseItemInfo(int id) throws RealException {
		LeaseItem leaseItem = getLeaseItem(id);
		return leaseItem.showLeaseItemInfo();
	}

	public ArrayList<String> getAllLeaseItemInfo() throws RealException {
		ArrayList<String> leaseItemsInfo = new ArrayList<String>();
		if (leaseItems.size() != 0) {
			for (LeaseItem leaseItem : leaseItems) {
				ArrayList<String> infos = leaseItem.showLeaseItemInfo();
				for (String info : infos)
					leaseItemsInfo.add(info);
			}
		}
		return leaseItemsInfo;
	}

	public void createLeaseItemUnit(int itemID) throws RealException {
		LeaseItem leaseItem = getLeaseItem(itemID);
		leaseItem.createUnit();
	}

	public LeaseItemUnit getLeaseItemUnit(int itemID, int unitSerialNO)
			throws RealException {
		LeaseItem leaseItem = getLeaseItem(itemID);
		return leaseItem.getUnit(unitSerialNO);
	}

	public void updateLeaseItemUnitStatus(int itemID, int unitSerialNo,
			String status) throws RealException {
		LeaseItem leaseItem = getLeaseItem(itemID);
		leaseItem.updateUnitStatus(unitSerialNo, status);
	}

	public void deleteLeaseUnit(int itemID, int unitSerialNo)
			throws RealException {
		LeaseItem leaseItem = getLeaseItem(itemID);
		leaseItem.deleteUnit(unitSerialNo);
	}

	public ArrayList<String> findLeaseItem(String searchPattern)
			throws RealException {
		ArrayList<String> matchingResults = new ArrayList<String>();
		for (LeaseItem leaseItem : leaseItems) {
			if (leaseItem.getName().startsWith(searchPattern)) {
				ArrayList<String> infos = leaseItem.showLeaseItemInfo();
				for (String info : infos)
					matchingResults.add(info);
			}
		}
		if (!matchingResults.isEmpty()) {
			return matchingResults;
		} else {
			throw new RealException(
					"There aren't any Lease Items matching your search.");
		}
	}

	public ArrayList<LeaseItem> getLeaseItems() {
		return leaseItems;
	}

	public void setLeaseItems(ArrayList<LeaseItem> leaseItems) {
		this.leaseItems = leaseItems;
	}

	public void save(ObjectOutputStream obj_out) throws IOException {
		obj_out.writeObject(leaseItems);
		obj_out.writeObject(new Integer(LeaseItem.getLastID()));
		obj_out.writeObject(new Integer(LeaseItemUnit.getLastSerialNumber()));
	}

	@SuppressWarnings("unchecked")
	public void load(ObjectInputStream obj_in) throws IOException, ClassNotFoundException {
		this.leaseItems = (ArrayList<LeaseItem>) obj_in.readObject();
		LeaseItem.setLastId(((Integer) obj_in.readObject()).intValue());
		LeaseItemUnit.setLastSerialNumber(((Integer) obj_in.readObject())
				.intValue());
	}

	public int getFreeUnits(int id)
	{
		int b=0;
		try {
			b= getLeaseItem(id).getFreeUnits();
		} catch (RealException e) {
			// No way to fail
			e.printStackTrace();
		}
		return b;
	}
	
}
